/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package daos;

import entidades.Cliente;
import entidades.Usuario;
import java.util.List;
import javax.persistence.Query;
import javax.persistence.EntityManager;
import negocio.NegocioDAO;
import negocio.NegocioException;
import seguranca.Interfaces.IUsuario;
import seguranca.Perfil;

/**
 *
 * @author renan
 */
public class UsuarioDAO extends NegocioDAO implements IUsuario {
    private final String LISTAQUARTOS = "listaQuartos";
    public static String login;
    public static String nivel;
    public static String nome;
    public static String id;
    private Usuario usuario;
    private Perfil perfil;

    public UsuarioDAO() {
        usuario = new Usuario();
        perfil = new Perfil();
        limpar();
    }

    public boolean estaNoNivel(String... niveis) {
        if (usuario.getNivel().trim().equals("")) {
            return false;
        }
        for (String n : niveis) {
            if (n.equals(usuario.getNivel())) {
                return true;
            }
        }
        return false;
    }

    public void inserir() throws NegocioException {
        if (buscaLogin()) {
            throw new NegocioException("Login já existente");
        }
        validar();
        EntityManager persistencia = NegocioDAO.getInstance().getEntityManager();
        persistencia.persist(usuario);
        persistencia.getTransaction().commit();
        persistencia.close();
    }

    public void alterar() throws NegocioException{
        validar();
        EntityManager persistencia = NegocioDAO.getInstance().getEntityManager();
        persistencia.merge(usuario);
        persistencia.getTransaction().commit();
        persistencia.close();
    }

    public void deletar() throws NegocioException{
        EntityManager persistencia = NegocioDAO.getInstance().getEntityManager();
        persistencia.remove(persistencia.find(Usuario.class,usuario.getId()));
        persistencia.getTransaction().commit();
        persistencia.close();
    }

    public boolean buscaLogin() {
        List<Usuario> colecao = getList(Usuario.class,
                "SELECT u FROM Usuario u WHERE u.login = :login", usuario.getLogin());
        if (colecao.isEmpty()) {
            return false;
        }

        return true;
    }

    private void validar() throws NegocioException {
        erros.limpar();

        if (estaVazio(usuario.getLogin())) {
            erros.campoObrigatorio("login");
        }

        if (estaVazio(usuario.getNivel())) {
            erros.campoObrigatorio("nivel");
        }

        if (estaVazio(usuario.getNome())) {
            erros.campoObrigatorio("nome");
        }

        if (estaVazio(usuario.getSenha())) {
            erros.campoObrigatorio("senha");
        }

        if (estaVazio(usuario.getSituacao())) {
            erros.campoObrigatorio("situação");
        }

        if (erros.existe()) {
            throw new NegocioException(erros);
        }
    }

    @Override
    @SuppressWarnings("unchecked")
    public <T> List<T> getList(Class<T> classToCast, String jpql, Object... parameters) {
        List<T> toReturn = null;
        EntityManager em = getEntityManager();
        Query qr = em.createQuery(jpql);
        qr.setParameter("login", parameters[0]);
        toReturn = qr.getResultList();
        em.getTransaction().commit();
        em.close();
        return toReturn;
    }

    public List<Usuario> pesquisar(String login) throws NegocioException {
        List<Usuario> colecao = null;
        EntityManager em = getEntityManager();
        Query individual = em.createQuery("SELECT u FROM Usuario u WHERE u.login like :login");
        Query todos = em.createQuery("SELECT u FROM Usuario u");
        if (login.equals("")) {
            colecao = todos.getResultList();
        } else {
            individual.setParameter("login", "%" + login + "%");
            colecao = individual.getResultList();
        }
        return colecao;
    }

    public void autenticarCliente() throws NegocioException{
        erros.limpar();
        if (estaVazio(usuario.getLogin())) {
            erros.campoObrigatorio("login");
        }
        if (estaVazio(usuario.getSenha())) {
            erros.campoObrigatorio("senha");
        }
        if (erros.existe()) {
            throw new NegocioException(erros);
        }
        List<Cliente> colecao = getList(Cliente.class,
                "SELECT c FROM Cliente c WHERE c.login = :login", usuario.getLogin());
        if (colecao.isEmpty()) {
            throw new NegocioException("login não existe");
        } else {
            Cliente autenticado = colecao.get(0);
            Usuario u = new Usuario();
            u.setSituacao("1");
            u.setId(autenticado.getId());
            u.setLogin(autenticado.getLogin());
            u.setNome(autenticado.getNome());
            u.setSenha(autenticado.getSenha());
            u.setNivel("3");
            //Usuario autenticado = colecao.get(0);
            UsuarioDAO usu = new UsuarioDAO();
            usu.setUsuario(u);
            if (usu.getUsuario().getSituacao().equals("1")) {
                if (usu.getUsuario().getSenha().equals(usuario.getSenha())) {
                    id = usu.getUsuario().getId();
                    nome = usu.getUsuario().getNome();
                    login = usu.getUsuario().getLogin();
                    nivel = usu.getUsuario().getNivel().equals("1") ? "ADMINISTRADOR"
                            : usu.getUsuario().getNivel().equals("2") ? "GERENTE"
                            : usu.getUsuario().getNivel().equals("3") ? "CLIENTE" : "";
                   usu.getPerfil().carregarPerfil(usu);
                } else {
                    throw new NegocioException("senha inválida");
                }
            } else {
                throw new NegocioException("usuário bloqueado");
            }
        }
    }

    public void autenticar() throws NegocioException {
        erros.limpar();
        if (estaVazio(usuario.getLogin())) {
            erros.campoObrigatorio("login");
        }
        if (estaVazio(usuario.getSenha())) {
            erros.campoObrigatorio("senha");
        }
        if (erros.existe()) {
            throw new NegocioException(erros);
        }
        List<Usuario> colecao = getList(Usuario.class,
                "SELECT u FROM Usuario u WHERE u.login = :login", usuario.getLogin());
        if (colecao.isEmpty()) {
            throw new NegocioException("login não existe");
        } else {
            Usuario autenticado = colecao.get(0);
            UsuarioDAO usu = new UsuarioDAO();
            usu.setUsuario(autenticado);
            if (usu.getUsuario().getSituacao().equals("1")) {
                if (usu.getUsuario().getSenha().equals(usuario.getSenha())) {
                    login = usu.getUsuario().getLogin();
                    nivel = usu.getUsuario().getNivel().equals("1") ? "ADMINISTRADOR"
                            : usu.getUsuario().getNivel().equals("2") ? "GERENTE"
                            : usu.getUsuario().getNivel().equals("3") ? "CLIENTE" : "";
                   usu.getPerfil().carregarPerfil(usu);
                } else {
                    throw new NegocioException("senha inválida");
                }
            } else {
                throw new NegocioException("usuário bloqueado");
            }
        }

    }

    public void limpar() {
        usuario.setNivel("");
        usuario.setSenha("");
        usuario.setLogin("");
        usuario.setId("");
        usuario.setSituacao("");
        usuario.setNome("");
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public Perfil getPerfil() {
        return perfil;
    }

    public void setPerfil(Perfil perfil) {
        this.perfil = perfil;
    }

}
